#include <func.h>
/*
    进程B的聊天发送界面
*/

struct MSG // 消息体
{
    long mtype; // 消息类型
    char buf[64]; // 变长消息内容
};

int main(int argc, char* argv[])
{
    int fdw = open("1.pipe", O_WRONLY);
    ERROR_CHECK(fdw, -1, "open");
    int fdr = open("2.pipe", O_RDONLY);
    ERROR_CHECK(fdr, -1, "open");

    // 创建消息队列
    int msgid = msgget(1000, IPC_CREAT|0600);
    ERROR_CHECK(msgid, -1, "msgget");
    struct MSG msg;

    char buf[128] = {0};
    fd_set fd;
    int ret;
    while (1)
    {
        FD_ZERO(&fd);
        FD_SET(STDIN_FILENO, &fd);
        FD_SET(fdr, &fd);

        select(fdr + 1, &fd, NULL, NULL, NULL);

        if (FD_ISSET(STDIN_FILENO, &fd))
        {
            memset(buf, 0, sizeof(buf));
            ret = read(STDIN_FILENO, buf, sizeof(buf));
            if (ret == 0)
            {
                break;
            }
            write(fdw, buf, strlen(buf) - 1);
        }
        if (FD_ISSET(fdr, &fd))
        {
            memset(buf, 0, sizeof(buf));
            ret = read(fdr, buf, sizeof(buf));

            // 准备消息
            memset(&msg, 0, sizeof(msg));
            msg.mtype = 1;
            strcpy(msg.buf, buf);

            // 发送消息
            int ret1 = msgsnd(msgid, &msg, strlen(msg.buf), 0);
            ERROR_CHECK(ret1, -1, "msgsnd");

            if (ret == 0) break;
        }
    }
    close(fdr);
    close(fdw);

    // 删除消息队列
    msgctl(msgid, IPC_RMID, NULL);
    return 0;
}